/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.losalpes.compra;

import com.losalpes.businessEntities.Articulo;
import com.losalpes.carritoCompra.CarritoCompraMock;
import com.losalpes.data.IPersistenceData;
import com.losalpes.data.PersistenceDataMock;
import com.losalpes.persistence.entity.Compra;
import com.losalpes.persistence.entity.FormaPago;
import com.losalpes.persistence.entity.TipoMueble;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author mgorduz
 */
public class CompraServiceMock implements ICompraService {

    /**
     * Atributos de la clase
     */
    private ArrayList<Compra> compras;

    private IPersistenceData persistenciaData;

    /**
     * Constructor por defecto
     */
    public CompraServiceMock() {
        this.compras = new ArrayList<Compra>();
        try {
            for (int i = 0; i < 20; i++) {
                Compra compra;
                DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
                if (i % 2 == 0) {

                    compra = new Compra("001", df.parse("01/" + i + "/2009"), "Bogota",
                            FormaPago.TARJETA_CREDITO, new CarritoCompraMock().findAllArticulos());

                } else {
                    compra = new Compra("002", df.parse("02/" + i + "/2009"), "Barranquilla",
                            FormaPago.TARJETA_CREDITO, new CarritoCompraMock().findAllArticulos());
                }

                this.compras.add(compra);
            }
        } catch (ParseException ex) {
            Logger.getLogger(CompraServiceMock.class.getName()).log(Level.SEVERE, null, ex);
        }

        this.persistenciaData = new PersistenceDataMock();
    }

    public void add(Compra compra) {
        this.compras.add(compra);
        this.persistenciaData.persistirCompra(compra);
    }

    public ArrayList<Compra> findAll() {
        return this.compras;
    }

    public ArrayList<Compra> findAllByDate(String fechaInicial, String fechaFinal) {
        ArrayList<Compra> comprasPorFecha = new ArrayList<Compra>();

        for (Iterator<Compra> it = compras.iterator(); it.hasNext();) {
            Compra compra = it.next();
            if (compra.getFechaCompra().after(this.convertirToFecha(fechaInicial)) && compra.getFechaCompra().before(this.convertirToFecha(fechaFinal))) {
                comprasPorFecha.add(compra);
            }
        }

        return comprasPorFecha;
    }

    public Articulo findMostSold(String fechaInicial, String fechaFinal, String ciudad) {
        Map<String, Integer> masVendido = new HashMap<String, Integer>();
        ArrayList<Articulo> articulos = new ArrayList<Articulo>();

        for (Iterator<Compra> it = compras.iterator(); it.hasNext();) {
            Compra compra = it.next();
            if (compra.getCiudad().equals(ciudad) &&
                    compra.getFechaCompra().after(this.convertirToFecha(fechaInicial)) &&
                    compra.getFechaCompra().before(this.convertirToFecha(fechaFinal))) {
                for (Iterator<Articulo> iter = compra.getArticulos().iterator(); iter.hasNext();) {
                    Articulo articulo = iter.next();
                    if (masVendido.containsKey(articulo.getNombreMueble())) {
                        //Entry e = (Map.Entry) articulo;

                        for (Map.Entry<String, Integer> entry : masVendido.entrySet()) {
                            if (articulo.getNombreMueble().equals(entry.getKey())) {
                                Integer contador = (Integer) entry.getValue() + articulo.getCantidad();
                                masVendido.remove(articulo);
                                masVendido.put(entry.getKey().toString(), contador);
                                break;
                            }
                        }


                    } else {
                        masVendido.put(articulo.getNombreMueble(), articulo.getCantidad());
                    }
                    articulos.add(articulo);
                }
            }
        }

        return this.getMasVendido(masVendido, articulos);
    }

    private Articulo getMasVendido(Map<String, Integer> masVendido, ArrayList<Articulo> articulos) {
        int maxValue = 0;
        String key = "";
        int num = 0;

        for (Map.Entry<String, Integer> entry : masVendido.entrySet()) {
            num += 1;
            if (entry.getValue() > maxValue) {
                maxValue = entry.getValue();
                key = entry.getKey();
            }
        }

        Articulo articulo = new Articulo();

        for (Iterator<Articulo> it = articulos.iterator(); it.hasNext();) {
            Articulo art = it.next();
            if (art.getNombreMueble().equals(key)) {
                articulo = art;
                break;
            }
        }

        return articulo;
    }

    public ArrayList<Compra> findAllByCustomerId(String numeroDocumento, String fechaInicial, String fechaFinal) {
        ArrayList<Compra> comprasPorCliente = new ArrayList<Compra>();

        for (Iterator<Compra> it = compras.iterator(); it.hasNext();) {
            Compra compra = it.next();
            if (compra.getNumeroDocumento().equals(numeroDocumento) && compra.getFechaCompra().after(this.convertirToFecha(fechaInicial)) && compra.getFechaCompra().before(this.convertirToFecha(fechaFinal))) {
                comprasPorCliente.add(compra);
            }
        }

        return comprasPorCliente;
    }

    private Date convertirToFecha(String fecha) {
        try {
            DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
            Date fechaFormateada = df.parse(fecha);
            return fechaFormateada;

        } catch (ParseException ex) {
            Logger.getLogger(CompraServiceMock.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

    public ArrayList<Articulo> findAllArticulosByTipoInterior(ArrayList<Compra> compras) {
        ArrayList<Articulo> articulos = new ArrayList<Articulo>();

        for (Iterator<Compra> it = compras.iterator(); it.hasNext();) {
            Compra compra = it.next();
            for (Iterator<Articulo> iter = compra.getArticulos().iterator(); iter.hasNext();) {
                Articulo articulo = iter.next();
                if (articulo.getTipoMueble().equals(TipoMueble.Interior)) {
                    if (!siExiste(articulo.getReferenciaMueble(), articulos)) {
                        articulos.add(articulo);
                    }
                }
            }
        }

        return articulos;
    }

    public ArrayList<Articulo> findAllArticulosByTipoExterior(ArrayList<Compra> compras) {
        ArrayList<Articulo> articulos = new ArrayList<Articulo>();
        for (Iterator<Compra> it = compras.iterator(); it.hasNext();) {
            Compra compra = it.next();
            for (Iterator<Articulo> iter = compra.getArticulos().iterator(); iter.hasNext();) {
                Articulo articulo = iter.next();
                if (articulo.getTipoMueble().equals(TipoMueble.Exterior)) {
                    if (!siExiste(articulo.getReferenciaMueble(), articulos)) {
                        articulos.add(articulo);
                    }
                }
            }
        }

        return articulos;
    }

    private boolean siExiste(String referencia, ArrayList<Articulo> articulos) {
        boolean existe = false;

        for (Iterator<Articulo> it = articulos.iterator(); it.hasNext();) {
            Articulo articulo = it.next();
            if (articulo.getReferenciaMueble().equals(referencia)) {
                existe = true;
            }
        }

        return existe;
    }

    public double getTotal(ArrayList<Articulo> articulosExterior, ArrayList<Articulo> articulosInterior) {
        double total = 0;

        if (articulosExterior.size() > 0 && articulosInterior.size() > 0) {
            for (Iterator<Articulo> it = articulosInterior.iterator(); it.hasNext();) {
                Articulo articulo = it.next();
                total = total + articulo.getTotal();
            }

            for (Iterator<Articulo> it = articulosExterior.iterator(); it.hasNext();) {
                Articulo articulo = it.next();
                total = total + articulo.getTotal();
            }
        }

        return total;
    }

    public ArrayList<String> findAllCities() {
        ArrayList<String> ciudades = new ArrayList<String>();

        for (Iterator<Compra> it = this.compras.iterator(); it.hasNext();) {
            Compra compra = it.next();

            if (!ciudades.contains(compra.getCiudad())) {
                ciudades.add(compra.getCiudad());
            }
        }

        return ciudades;
    }
}
